/*
 * table_ConfluxNodeStack.c
 *
 *  Created on: 2012/06/29
 *      Author: guanxiaoying
 */

#include "../../parser/coredef.h"
typedef struct _CONFLUXNODE_STACK
{
	BOOL isBreakInvalid;
	U2 kind;
	AST confluxCmdList;
} CONFLUXNODE_STACK, *PCONFLUXNODE_STACK;
#define TableSize  (sizeof(CONFLUXNODE_STACK))
#define TableType  PCONFLUXNODE_STACK
#define stTable stConfluxNodeStackManager.memoryBlocks
#define maxTable stConfluxNodeStackManager.maxRecordNum
#define  maxNumPerBlk  (stConfluxNodeStackManager.astMaxNum_Block)

/* private field */
static TABLEMANAGER stConfluxNodeStackManager = {
//		U4                  usIdx;
		0,
//		PSZ				    con_pszName;    constant
		__FILE__,
//		U2					con_usSize;		constant
		TableSize,
//		U2					block_num;	　　　　　　　Reset clear  際　要
		0,
//		S4					astMaxNum_Block;     １回設定のみ
		0,
//		S4					astTabNum_LastPage; 　　　　Reset clear  際　要
		0,
//		S4					astMaxNum_LastPage;     Reset clear  際　要
		0,
//		U4					ulMaxByte;	　　　　　　　　　　クリアしない
		0,
//		U4					con_minPageSize;　　　　　　　　　　constant
		0
};

static VOID resetListener( U4  procid, U2 index )
{
	if( procid == stConfluxNodeStackManager.u4Idx )
	{
		if( index > 0 && index < MAX_VOLUMN_OF_TABLE )
		{
			stTable[ index-1] = NULL;
		}
	}
}
static TableType core_getTable( AST index )
{
	TableType temp = (TableType)Check_Com( &stConfluxNodeStackManager,  resetListener, index );
	if( temp != NULL ){ return &temp[index%maxNumPerBlk]; } return NULL;
}
static BOOL ClearTable( VOID )
{
	return Clear_Com( &stConfluxNodeStackManager );
}
static BOOL ResetTable( VOID )
{
	return Reset_Com( &stConfluxNodeStackManager );
}
static BOOL AllocTable( AST astReqArg )
{
	return AllocTable_Com( &stConfluxNodeStackManager, astReqArg, resetListener );
}
static AST getMaxLineNum( VOID )
{
	return maxTable;
}

static AST getConfluxCmdList( AST index )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->confluxCmdList;
}
static AST setConfluxCmdList( AST index, AST value )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->confluxCmdList = value;
}
static U2 getKind( AST index )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->kind;
}
static U2 setKind( AST index, U2 value )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->kind = value;
}
static BOOL isBreakInvalid( AST index )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->isBreakInvalid;
}
static BOOL setBreakInvalid( AST index, BOOL value )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->isBreakInvalid = value;
}
const CONFLUXNODESTACKACCESS stCgConfluxNodeStackAccess = {
		ClearTable,
		ResetTable,
		AllocTable,
		getMaxLineNum,
		{
				isBreakInvalid,
				setBreakInvalid
		},
		{
				getKind,
				setKind
		},
		{
				getConfluxCmdList,
				setConfluxCmdList
		}
};
